package com.hss.cls

/**
 * Created by Administrator on 2017/6/6.
 */
class PropertyTest {
    public var name:String = "lisi"
    public val state:String ? = "sd"
    var age =1//基类成员属性推断得到, 则属性类型的声明也可以省略.
    val simple: Int? // 属性类型为 Int, 使用默认的取值方法, 属性值必须在构造器中初始化
    init {
        simple = 10
    }

    val isEmpty:Boolean
    get()= this.state.equals(other = "aa", ignoreCase = true)


    var strRes:String
    get() = this.toString()
    private  set(value) {
        strRes = value
    }
    var setterVisibility: String = "abc"
        private set // 设值方法的可见度为 private, 并使用默认实现

   /* var setterWithAnnotation: Any? = null
    @Inject set // 对设值方法添加 Inject 注解*/

//    属性的后端域变量(Backing Field)
//    Kotlin 的类不能拥有域变量. 但是, 使用属性的自定义访问器时, 有时会需要后端域变量(backing field). 为了
//    这种目的, Kotlin 提供了一种自动的后端域变量, 可以通过 field 标识符来访
    var counter = 0
     set(value) {
         if (value >= 0){
             field = value
         }
     }
//    field 标识符只允许在属性的访问器函数内使用.
//比如, 下面的情况不会存在后端域变量:
    val isEmpty1: Boolean
        get() = this.age == 0


    private var _table:Map<String,Int>?=null
    public val table:Map<String,Int>
    get() {
        if (_table == null)
            _table = HashMap()// 类型参数可以自动推断得到, 不必指定
        return  _table?:throw AssertionError("Set to null by another thread")
    }

//延迟初始化属性(Late-Initialized Property)
    lateinit var subject:String

}


fun copProperty(mprop:PropertyTest):PropertyTest{
    val  result = PropertyTest()
    result.name = mprop.name
    return result
}


//取值方法(Getter)与设值方法(Setter)
/*
var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]
*/


const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprecated(SUBSYSTEM_DEPRECATED) fun foo() {

}